/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serverClasses;

import commonClasses.*;
import commonClasses.Messages.QueryFollowedMsg;
import commonClasses.Messages.FileEOFMsg;
import commonClasses.Messages.Msg;
import commonClasses.Messages.FileMsg;
import commonClasses.Messages.QueryMsg;
import commonClasses.commonInterfaces.HostModelIntf;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import commonClasses.commonInterfaces.ProtocolIntf;

/**
 *
 * @author Pozytywny!
 */
public class QueryMsgService {

    private ProtocolIntf _protocol;
    private HostModelIntf _model;
    private Long _itemID;

    public QueryMsgService(ProtocolIntf protocol, Long itemID) {
        this._protocol = protocol;
        this._model = protocol.getHostModel();
        this._itemID = itemID;
    }

    public void execute() {
        Utils.write("QUERY_MSG_NR");
        /*
         * bierze odpowiedni item z modelu hosta
         * jeżeli nie ma plików odpowiada tym samym komunikatem
         * w przeciwnym przypadku wysyła kolejne pliki w
         * kolejnych komunikatach
         */


        /*
         * normalnie to szukamy w modelu po _itemID i przypisujemy na item
         */


        //tymczasowy shit-------
        Item item = new Item();
        item.setBasic(123, new Price("QWE", 1234l), "asdf");
        item.addFilePath("C:/Lilie.jpg");
        item.addFilePath("C:/Zima.jpg");
        //tymczasowy shit-------


        ArrayList<String> filesPaths = new ArrayList<String>();
/*        try {
            filesPaths = _model.getItem(_itemID).getFilesPaths();
        } catch (Exception e) {
            e.printStackTrace();
        }
*/
        filesPaths = item.getFilesPaths();

        if (!(item.getFilesPaths() == null || item.getFilesPaths().isEmpty())) {
            filesPaths = item.getFilesPaths();
        }

        if (filesPaths.size() == 0) {
            //wysyłamy to co otrzymaliśmy.
            Utils.write("Qmsgserv: zerowej długości lista ściezek plików");
            QueryMsg queryMsg2 = new QueryMsg(_protocol, item.getId());

            try {
                queryMsg2.send();
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
        } else if (filesPaths.size() > 0) {

            Utils.write("Qmsgserv: wysyłam qfm");
            QueryFollowedMsg queryFollowedMsg = new QueryFollowedMsg(_protocol, item.getId());
            try {
                queryFollowedMsg.send();
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
            for (int i = 0; i < filesPaths.size(); i++) {
                File file = new File(filesPaths.get(i));
                if (file.length() > Integer.MAX_VALUE) {
                    Utils.write("Qmsgserv: za długi plik!");
                    continue;
                }
                byte arr[] = new byte[Msg.longToInt(file.length())];
                try {
                    int count =
                            new FileInputStream(file).read(arr, 0, Msg.longToInt(file.length()));

                    if (count != file.length()) {
                        System.out.println("nie wczytał oczekiwanej liczby bajtów");
                        continue;
                    }

                    if (i < filesPaths.size() - 1) { //zwykły message
                        try {
                            Utils.write("Qmsgserv: wysyłam file msg");
                            new FileMsg(_protocol, arr).send();
                        } catch (Exception e) {
                            e.printStackTrace();
                            continue;
                        }

                    } else { //ostatni message
                        try {
                            Utils.write("Qmsgserv: wysyłam file eof msg");
                            new FileEOFMsg(_protocol, arr).send();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }

                } catch (FileNotFoundException fnfe) {
                    fnfe.printStackTrace();
                    continue;
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                    continue;
                }
            }

        }
        Utils.write("Qmsgserv: wychodze z qmsgserv");
    }
}
